
#include <QThread>
#include <QDebug>
#include <QImage>
#include <QPixmap>
#include <opencv2/opencv.hpp>
#include "V4L2CamCTL.h"
#include <fstream>
#include <QMutex>
#include <QSemaphore>
// extern RKNN_YOLOVX* RY_thread;
// extern QMutex mutex;
extern QSemaphore semaphore;
class ImageProcessingThread : public QThread {
    Q_OBJECT

public:
    cv::Mat frame;
    V4L2CamCTL *CamCTL;
    ImageProcessingThread(QObject* parent = nullptr) : QThread(parent) {
        CamCTL = new V4L2CamCTL("/dev/video1");
        CamCTL->init_device();
    }
    void save_image_as_data(const cv::Mat& image, const std::string& filename) {
        std::ofstream file(filename, std::ios::binary);
        if (!file) {
            std::cerr << "无法打开文件: " << filename << std::endl;
            return;
        }

        // 将图像数据写入文件
        file.write(reinterpret_cast<const char*>(image.data), image.total() * image.elemSize());
        file.close();
    }
    void cleanup() {
            qWarning("cleanup.");

        // 在这里执行任何必要的清理工作
        if (CamCTL != nullptr) {
            // 关闭摄像头或释放其他资源
            delete CamCTL;
            CamCTL = nullptr;
        }

        // 释放信号量
        semaphore.release();

        // 其他清理工作...
    }
    void stop() {
        requestInterruption(); // 设置中断标志
        quit();
        wait();
    }
protected:
void run() override {
        // 确保CamCTL已初始化
        if (CamCTL == nullptr) {
            qWarning("CamCTL is not initialized.");
            return;
        }

        while (!isInterruptionRequested()) {  // 检查是否请求了中断
            semaphore.acquire();  // 获取信号量

            // 使用互斥锁保护对共享资源的访问
            // QMutexLocker locker(&mutex);

            // 读取帧
            if (CamCTL->read_frame(frame)==0) {
                // 处理帧（例如转换颜色空间、阈值处理等）
                // cvtColor(frame, frame, cv::COLOR_BGR2GRAY);
                // cv::threshold(frame, frame, 100, 255, cv::THRESH_BINARY);

                // 发射信号，通知主线程或其他线程图像已处理
                emit imageProcessed(frame);

                // 如果需要显示图像，可以使用以下代码
                // cv::imshow("Original Image", frame);
                // cv::waitKey(1);  // 非阻塞显示

                // 休眠一段时间以减少CPU占用（可选）
                // QThread::msleep(200);
            } else {
                qWarning("Failed to read frame from camera.");
            }
        }

        // 退出前的清理工作
        cleanup();
    }
signals:
    // void imageProcessed(const QPixmap& pixmap);
    void imageProcessed(cv::Mat &imageData); // 定义信号
};
